package cn.lg.soar.system.auth.service;

import cn.lg.soar.common.util.current.CurrentProxy;
import cn.lg.soar.common.util.data.DataUtil;
import cn.lg.soar.database.base.service.IBaseService;
import cn.lg.soar.system.api.model.UserCreateDTO;
import cn.lg.soar.system.auth.entity.User;
import cn.lg.soar.system.auth.model.UserDetailVo;

import java.util.Collection;
import java.util.List;

/**
 * @author luguoxiang
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface IUserService extends IBaseService<User>, CurrentProxy<IUserService> {

    /**
     * 更加账号获取用户
     * @param username
     * @return
     */
    User getByUsername(String username);

    /**
     * 获取用户详情
     * @param id
     * @return
     */
    UserDetailVo detail(long id);

    /**
     * 创建用户
     * @param user
     * @return
     */
    Long create(UserCreateDTO user);

    /**
     * 修改用户状态
     * @param ids
     * @param status
     */
    void updateStatus(Integer status, Collection<Long> ids);

    /**
     * 修改用户状态
     * @param status
     * @param ids
     */
    default void updateStatus(Integer status, Long...ids) {
        updateStatus(status, DataUtil.arrayToSet(ids));
    }

    /**
     * 修改用户密码
     * @param ids
     * @param password
     */
    void updatePassword(String password, Collection<Long> ids);

    /**
     *
     * @param password
     * @param ids
     */
    default void updatePassword(String password, Long...ids) {
        updatePassword(password, DataUtil.arrayToSet(ids));
    }

    /**
     * 重置用户密码
     * @param ids
     */
    void resetPassword(Collection<Long> ids);

    /**
     * 重置用户密码
     * @param ids
     */
    default void resetPassword(Long...ids) {
        resetPassword(DataUtil.arrayToSet(ids));
    }

    /**
     * 密码校验
     * @param id 用户id
     * @param password 密码
     * @return
     */
    default boolean verifyPassword(Long id, String password) {
        User user = proxy().getById(id);
        return verifyPassword(user, password);
    }

    /**
     * 密码校验
     * @param user
     * @param password
     * @return
     */
    boolean verifyPassword(User user, String password);

    /**
     * 获取用户当前所有角色(用户角色、用户部门角色、用户岗位角色)
     * @param userId
     * @return
     */
    List<Long> getUserCurrentAllRoleIds(Long userId);

    /**
     * 获取用户当前所有机构(用户机构、下级机构)
     * @param userId
     * @return
     */
    List<Long> getUserCurrentAllOrgIds(Long userId);

    /**
     * 判断某个用户是否是超级管理员
     * @param username
     * @return
     */
    boolean isSuperAdministrator(String username);

    /**
     * 判断某个用户是否是超级管理员
     * @param userId
     * @return
     */
    boolean isSuperAdministrator(Long userId);

    /**
     * 清空用户缓存
     * @param userId
     */
    void clearCache(Long userId);

}
